#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_adc.h"
#include "hi_errno.h"

#define LED_TASK_STACK_SIZE 512
#define LED_TASK_PRIO 25
#define LED1_TEST_GPIO 10
#define LED2_TEST_GPIO 1
#define TASK_DELAY_TIME 200000
#define F1 11
#define F2 12

enum LedState {
    LED_OFF = 0,
    LED_ON,
};

enum LedState g_Led1State = LED_OFF;
enum LedState g_Led2State = LED_OFF;

static void F1_Pressed(char *arg)
{
    (void)arg;
    printf("F1 Pressed\n");
    g_Led1State = (enum LedState)!g_Led1State;
    IoTGpioSetOutputVal(LED1_TEST_GPIO, g_Led1State);
    usleep(TASK_DELAY_TIME);
}

static void F2_Pressed(char *arg)
{
    (void)arg;
    printf("F2 Pressed\n");
    g_Led2State = (enum LedState)!g_Led2State;
    IoTGpioSetOutputVal(LED2_TEST_GPIO, g_Led2State);
    usleep(TASK_DELAY_TIME);
}

static void ButtonledInit(void)
{
    // 初始化LED1
    IoTGpioInit(LED1_TEST_GPIO);
    hi_io_set_func(LED1_TEST_GPIO, HI_IO_FUNC_GPIO_10_GPIO);
    IoTGpioSetDir(LED1_TEST_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetOutputVal(LED1_TEST_GPIO, g_Led1State);

    // 初始化LED2
    IoTGpioInit(LED2_TEST_GPIO);
    hi_io_set_func(LED2_TEST_GPIO, HI_IO_FUNC_GPIO_1_GPIO);
    IoTGpioSetDir(LED2_TEST_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetOutputVal(LED2_TEST_GPIO, g_Led2State);

    // 初始化按键F1
    hi_gpio_init();
    hi_io_set_pull(F1, HI_IO_PULL_UP);
    hi_io_set_func(F1, HI_IO_FUNC_GPIO_11_GPIO);
    hi_gpio_set_dir(F1, HI_GPIO_DIR_IN);
    hi_gpio_register_isr_function(F1,
                                 HI_INT_TYPE_EDGE,
                                 HI_GPIO_EDGE_FALL_LEVEL_LOW,
                                 &F1_Pressed,
                                 NULL);

    // 初始化按键F2
    hi_io_set_pull(F2, HI_IO_PULL_UP);
    hi_io_set_func(F2, HI_IO_FUNC_GPIO_12_GPIO);
    hi_gpio_set_dir(F2, HI_GPIO_DIR_IN);
    hi_gpio_register_isr_function(F2,
                                 HI_INT_TYPE_EDGE,
                                 HI_GPIO_EDGE_FALL_LEVEL_LOW,
                                 &F2_Pressed,
                                 NULL);
}

static void *LedTask(const char *arg)
{
    (void)arg;
    while (1) {
        // 保持任务活跃
        usleep(1000000);
    }
    return NULL;
}

static void LedExampleEntry(void)
{
    osThreadAttr_t attr;

    ButtonledInit();

    attr.name = "LedTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = LED_TASK_STACK_SIZE;
    attr.priority = LED_TASK_PRIO;

    if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
        printf("[LedExample] Failed to create Ledtask!\n");
    }
}

SYS_RUN(LedExampleEntry);    